八皇后问题感觉是递归算法中比较简单的一种,核心思想就是放置之前检查行列四个斜方位即可,共92种方案,还是挺有趣的,和汉诺塔一样,应该属于递归比较经典的问题
#include<iostream>
using namespace std;
int g_count=0;
bool CanPlace(int row,int col,int (*chess)[8]){
for(int i=0;i<8;i++){
if(chess[i][col]==1){//check col
return false;
}
if(chess[row][i]==1){//check row
return false;
}
}
for(int i=0;i<8;i++){//check left-front
if(row-i<0||col-i<0){
break;
}
if(chess[row-i][col-i]==1){
return false;
}
}
for(int i=0;i<8;i++){//check right-front
if(row-i<0||col+i>7){
break;
}
if(chess[row-i][col+i]==1){
return false;
}
}
for(int i=0;i<8;i++){//check left-below
if(row+i>7||col-i<0){
break;
}
if(chess[row+i][col-i]==1){
return false;
}
}
for(int i=0;i<8;i++){//check right-below
if(row+i>7||col+i>7){
break;
}
if(chess[row+i][col+i]==1){
return false;
}
}
return true;
}
void EightQueen(int row,int col,int (*chess)[8]){
//temp 2Darray
int chess2[8][8];
//put last scene to temp 2Darray
for(int i=0;i<8;i++){
for(int j=0;j<8;j++){
chess2[i][j]=chess[i][j];
}
}
if(row==8){//show result
for(int i=0;i<8;i++){
for(int j=0;j<8;j++){
cout<<chess2[i][j]<<' ';
}
cout<<endl;
}
cout<<endl;
g_count++;
}
else{
for(int j=0;j<8;j++){
if(CanPlace(row,j,chess2)){
chess2[row][j]=1;//put chess
EightQueen(row+1,j,chess2);//move to next row
chess2[row][j]=0;//remove chess to use for next by same chess 2Darray
}
}
}
};
int main(){
int chess[8][8]={
0
};
EightQueen(0,0,chess);
cout<<g_count<<endl;
return 0;
}